// utils/avatar.utils.ts

/**
 * @class AvatarUtils
 * @description 生成随机或指定风格的 DiceBear 头像 URL
 * @see https://api.dicebear.com/
 */
export class AvatarUtils {
    /**
     * 支持的 DiceBear 头像风格列表
     */
    private static readonly STYLES = [
        "lorelei",
        "thumbs",
        "pixel-art",
        "adventurer",
        "adventurer-neutral",
        "big-smile",
        "bottts-neutral",
        "fun-emoji",
        "micah",
        "notionists"
    ] as const;

    /**
     * 生成一个随机风格的 DiceBear 头像 URL
     * @param seed - 可选种子值，默认使用当前时间戳，保证每次调用都不同
     * @returns 随机风格的 SVG 头像 URL
     * @example
     * AvatarUtils.getRandomUrl(); // → https://api.dicebear.com/9.x/pixel-art/svg?seed=1712345678901
     * AvatarUtils.getRandomUrl("user_123"); // → 固定用户，风格随机但稳定
     */
    static getRandomUrl(seed: string | number = Date.now()): string {
        const randomStyle = this.STYLES[Math.floor(Math.random() * this.STYLES.length)];
        return `https://api.dicebear.com/9.x/${randomStyle}/svg?seed=${encodeURIComponent(seed)}`;
    }

    /**
     * 根据指定风格生成头像 URL（可选）
     * @param style - 指定风格，必须是 STYLES 中的值
     * @param seed - 种子值
     * @returns 指定风格的头像 URL
     * @throws 如果 style 无效
     */
    static getUrlByStyle(style: (typeof this.STYLES)[number], seed: string | number = Date.now()): string {
        if (!this.STYLES.includes(style as any)) {
            throw new Error(`Invalid avatar style: ${style}. Allowed: ${this.STYLES.join(", ")}`);
        }
        return `https://api.dicebear.com/9.x/${style}/svg?seed=${encodeURIComponent(seed)}`;
    }

    /**
     * 获取所有支持的风格列表（只读）
     */
    static getSupportedStyles(): readonly string[] {
        return [...this.STYLES]; // 返回副本，防止外部修改
    }
}
